const puppeteer = require('puppeteer');
const cheerio = require('cheerio');
const Post = require('../models/Post');
const { Wecom } = require('wecom'); 
const { OpenAI } = require('openai'); 
const WecomMessenger = require('../utils/wecomMessenger');

class CrawlerService {
    async scrapeForum() {
        // 根据环境变量选择浏览器路径
        const browserPath = process.env.NODE_ENV === 'production' 
            ? process.env.CHROME_PATH_PROD 
            : process.env.CHROME_PATH_DEV;

        console.log('Current environment:', process.env.NODE_ENV);
        console.log('Using browser path:', browserPath);

        const browser = await puppeteer.launch({
            headless: true,
            executablePath: browserPath,
            args: [
                '--no-sandbox',
                '--disable-setuid-sandbox',
                '--disable-infobars',
                '--window-position=0,0',
                '--ignore-certifcate-errors',
                '--ignore-certifcate-errors-spki-list',
            ]
        });

        try {
            const page = await browser.newPage();
            
            // 设置更长的超时时间
            page.setDefaultNavigationTimeout(60000);
            page.setDefaultTimeout(60000);

            // 设置页面监听器
            page.on('error', err => {
                console.error('页面错误:', err);
            });

            page.on('console', msg => {
                console.log('页面日志:', msg.text());
            });

            // 设置浏览器特征
            await page.setUserAgent('Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1 Edg/133.0.0.0');
            await page.setViewport({
                width: 1920,
                height: 1080,
                deviceScaleFactor: 1,
            });

            await page.setExtraHTTPHeaders({
                'Accept-Language': 'zh-CN,zh;q=0.9',
                'Accept': 'application/json, text/plain, */*', // 修改 Accept 头
                'Accept-Encoding': 'gzip, deflate, br, zstd'
            });

            // 添加重试机制
            const posts = [];
            let retries = 3;
            let response;

            while (retries > 0) {
                try {
                    // Fetch data from API
                    response = await page.goto('https://appshare.hualongxiang.com/v5_0/forum/forum-index?page=1&tabid=2&typeid=0&sortid=undefined&fid=103', {
                        waitUntil: 'networkidle2',
                        timeout: 60000
                    });

                    // 等待API响应
                    // await page.waitForResponse(response => response.url().includes('forum-index'), {
                    //     timeout: 60000
                    // });

                    const responseText = await response.text();
                    const jsonResponse = JSON.parse(responseText);
                    const index = 0;
                    let count = 0;  // 添加计数器变量的定义

                    // 处理数据...
                    for (const item of jsonResponse.data.feed) {
                        count++;
                        if (item.data.title.includes('地铁') ) {
                        //if (1 && count <10) {
                            const post = {
                                title: item.data.title,
                                url: item.data.direct.replace(
                                    /hualongxiang:\/\/thread\/\?tid=(\d+)(?:&replyid=\d+)?/,
                                    'http://www.hualongxiang.com/read.php?tid=$1'
                                ),
                                description: item.data.desc,
                                time: item.data.time_text,
                                author: item.data.source.split(' ')[0],
                                authorUrl: '',
                                tid: item.data.id
                            };

                            const exists = await Post.findOne({ tid: post.tid });
                            if (exists) {
                                console.log(`Post with tid: ${post.tid} already exists`);
                                continue;
                            }

                            // 获取帖子内容时添加重试机制
                            let contentRetries = 3;
                            while (contentRetries > 0) {
                                try {
                                    await page.goto(`https://appshare.hualongxiang.com/wap/thread/view-thread/tid/${post.tid}`, {
                                        waitUntil: 'networkidle2',
                                        timeout: 2000
                                    });

                                    await page.waitForSelector('#content_box', { timeout: 2000 });
                                    const content = await page.$eval('#content_box', el => el.innerText);
                                    //post.content = content.replace(/<[^>]*>/g, '').replace(/[\n]+/g, ' ').replace(/[\t]+/g, ' ').trim().slice(0, 100) + '...';
                                    post.content = content.replace(/(<[^>]*>|[\n\t\r]+)/g, ' ').trim();//过滤html标签、\n\t标签
                                    console.log(content);
                                    await new Post(post).save();
                                    posts.push(post);
                                    break;
                                } catch (error) {
                                    contentRetries--;
                                    if (contentRetries === 0) throw error;
                                    console.log(`获取帖子内容失败，重试中... (剩余 ${contentRetries} 次)`);
                                    await new Promise(resolve => setTimeout(resolve, 5000));
                                }
                            }
                        }
                    }
                    break; // 如果成功就跳出循环
                } catch (error) {
                    retries--;
                    if (retries === 0) throw error;
                    console.log(`抓取失败，重试中... (剩余 ${retries} 次)`);
                    await new Promise(resolve => setTimeout(resolve, 2000));
                }
            }

            if(posts.length == 0){
                console.log('没有发现新帖子');
                return;
            }
            // 发送给ai判断处理
           const question1 = posts.map((post, index) => {
                const number = index + 1;
                return `${number}、帖子标题：${post.title}；帖子内容：${post.content}`;
           }).join('\n\n');
           console.log(question1);
           const systemPrompt = `你是一位专业的公共交通舆情分析专家，专注于分析常州地铁相关的负面的反馈或负面舆论。
请仔细分析每条信息，重点关注：
1. 安全隐患
2. 服务质量问题
3. 运营延误
4. 设施故障
5. 乘客投诉
6. 市民举报
7. 其他反馈的各类负面问题
请保持客观专业的判断标准。`;

           const userPrompt = `请分析以下网络帖子，识别其中属于常州地铁的负面信息。
要求：
1. 只关注确实反映问题的内容，避免过度解读
2. 返回包含负面信息的帖子序号
3. 必须以严格的JSON格式返回，返回格式：{"post_ids":[1,2,3]}
以下是需要分析的帖子内容：
${question1}`;
           const testSystemPrompt = `你是一位专业的舆情分析专家，专注于发现的负面的舆情。`;
           const testUserPrompt = `请分析下面的网络帖子，识别其中的负面信息。
要求：
1. 只关注确实反映问题的内容，避免过度解读
2. 返回包含负面信息的帖子序号
3. 必须以严格的JSON格式返回，格式为：{"post_ids":[1,2,3]}
以下是需要分析的帖子内容：
${question1}`;

            const openai = new OpenAI({
                apiKey: process.env['ARK_API_KEY'],
                baseURL: 'https://ark.cn-beijing.volces.com/api/v3',
              });
              console.log('----- standard request -----')
              const completion = await openai.chat.completions.create({
                messages: [
                  { role: 'system', content: systemPrompt },
                  { role: 'user', content: userPrompt },
                ],
                model: 'doubao-1-5-pro-32k-250115',
              });
              console.log(completion.choices[0]?.message?.content);//ai返回json格式字符
              
              // 添加错误处理和验证
              let result = { post_ids: [] };
              try {
                const content = completion.choices[0]?.message?.content || '';
                // 检查返回内容是否是JSON格式
                if (content.trim().startsWith('{') && content.trim().endsWith('}')) {
                  result = JSON.parse(content);
                } else {
                  console.log('AI返回的不是有效JSON格式:', content);
                  // 尝试从文本中提取JSON部分
                  const jsonMatch = content.match(/\{.*\}/s);
                  if (jsonMatch) {
                    try {
                      result = JSON.parse(jsonMatch[0]);
                      console.log('成功从文本中提取JSON部分');
                    } catch (e) {
                      console.log('从文本中提取的JSON部分解析失败');
                    }
                  }
                }
              } catch (error) {
                console.error('解析AI返回结果失败:', error.message);
                // 使用默认空数组继续执行
              }
              
              let message = '';  // 在这里定义 messages 字符串
              if(result.post_ids && result.post_ids.length > 0){
                const matchedPosts = result.post_ids.map(postId => 
                    posts[postId - 1] // postId 从 1 开始，所以需要 -1 来获取正确的数组索引
                ).filter(post => post); // 过滤掉可能的 undefined 值
                matchedPosts
                    .map(post =>  message+=`
标题：${post.title}
链接：${post.url}
------------------------`).join('\n');
                console.log(message);
                
                // 使用通用的消息发送方法
                try {
                    await WecomMessenger.sendMessage({
                        touser: "1000131",
                        content: message
                    });
                } catch (error) {
                    console.error('发送消息错误:', error);
                }
            } else {
                console.log('没有发现负面信息');
            }
            

            return posts;
        } catch (error) {
            console.error('爬虫错误:', error);
            throw error;
        } finally {
            await browser.close();
        }
    }
}

module.exports = new CrawlerService();